package com.ndp.fb.mongo.api;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ndp.fb.model.AdGroupStats;
import com.ndp.fb.model.AdResourceStats;
import com.ndp.fb.model.AdSetStats;
import com.ndp.fb.mongo.model.ImageVersion;
import com.ndp.fb.mongo.model.UpdateAdGroupStatParam;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by Jacky on 2015/3/4.
 */
public interface AdGroupStatsMongoService {

    /**
     * 批量保存到历史表以及临时的90天的表中
     *
     * @param adGroupStatsList
     */
    void batchSaveHistoryAndTemp90Days(List<AdGroupStats> adGroupStatsList);

    /**
     * 根据指定字段更新
     *
     * @param adGroupStatsList
     * @param where
     * @discription
     * @author giser.yang
     * 创建时间 2015年9月22日 下午5:39:41
     */
    void batchSaveByWhereWithoutHistory(List<AdGroupStats> adGroupStatsList, String[] where);

    /**
     * 根据accountId/adGroupId（二者至少有一个）和day查询统计数据（注意：只返回统计数据，业务数据返回值不可用）
     *
     * @param matchAccountId accountId过滤条件（可选参数）
     * @param matchAdGroupId adGroupId过滤条件（可选参数）
     * @param matchDay       day过滤条件（必选参数）
     * @return
     */
    List<AdGroupStats> queryStatsDataByDay(Long matchAccountId, Long matchAdGroupId, String matchDay);

    /**
     * 根据adGroupId和时间范围查询统计数据（注意：只返回统计数据，业务数据返回值不可用）
     *
     * @param matchAdGroupId adGroupId过滤条件（必选参数）
     * @param matchSinceDay  查询开始日过滤条件（必选参数）
     * @param matchUntilDay  查询结束日过滤条件（必选参数）
     * @param returnFields   需要返回的字段过滤条件（可选参数）
     * @return 查询结果列表
     */
    List<AdGroupStats> queryStatsDataByTimeRange(Long matchAdGroupId, String matchSinceDay, String matchUntilDay, String... returnFields);

    /**
     * 以day或accountId或{"day":[campaignId列表]}作为过滤条件，根据campaignId和day进行汇总数据，三者可独立查询（注意：只返回统计数据，业务数据返回值不可用）
     *
     * @param matchDay       查询day过滤条件（可选参数）
     * @param matchAccountId 账号id过滤条件（可选参数）
     * @return
     */
    List<AdSetStats> groupStatsDataByDayAndCampaignId(String matchDay, Long matchAccountId);

    AdGroupStats getLatestSnap(Long adGroupId, Date triggerPoint);

    Map<String, Integer> groupByImageHashForActiveAdCount(Set<String> md5Set, Set<Long> accountIdSet);

    /**
     * 统计某个账号某段时间内分应用和分图片的统计数据
     *
     * @param matchAccountId 统计账号（必须项）
     * @param matchDay       统计周期开始日（必须项）
     * @return
     */
    List<AdResourceStats> groupStatsDataByImageHashAndApp(Long matchAccountId, String matchDay);

    /**
     * 统计某个adGroup某段时间内分应用和分图片的统计数据
     *
     * @param matchAdGroupId 统计adGroupId（必须项）
     * @param startDay       统计周期开始日（必须项）
     * @param endDay         统计周期结束日（必须项）
     * @param imageInfo
     * @return
     */
    List<AdResourceStats> groupStatsDataByImageHashAndAppForNewAd(Long matchAdGroupId, String startDay, String endDay, List<ImageVersion> imageInfo);

    /**
     * 分页查询ad给定day和breakdowns的统计数据
     *
     * @param accountId
     * @param adGroupId
     * @param day
     * @param breakdowns
     * @param pIndex
     * @param pSize
     * @return
     */
    List<AdGroupStats> getDetail(Long accountId, Long adGroupId, String day, String breakdowns, Integer pIndex, Integer pSize);

    /**
     * 统计当前所有账号的花费
     *
     * @return
     */
    Map<Long, Long> getAdSpentGroupByAccountId(String day);

    /**
     * 计算营销目标的统计数据
     *
     * @param adIdList  同属于某一个营销目标的所有ad编号列表
     * @param today     今天的日期
     * @param yesterday 昨天的日期
     * @return 计算出的结果
     */
    JSONObject groupByAdMarketTarget(List<Long> adIdList, String today, String yesterday);

    void updateStatsDataByDay(List<UpdateAdGroupStatParam> updateAdGroupStatParams, List<Long> entrustAccounts);

    /**
     * 将指定的营销目标或者广告的统计数据按天分割
     *
     * @param adMarketTargetId 营销目标ID
     * @param adId             广告ID
     * @param startDay         开始日
     * @param endDay           结束日
     * @return 统计结果
     */
    JSONArray groupByDay(String adMarketTargetId, Long adId, String startDay, String endDay);
}
